package ep2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;

public class GerenciadorThreads {
			
	private ArrayList<Thread> listaThreads = new ArrayList<Thread>();
	private BD bd;
	private int tamanhoBD;
	
	private int leitores;
	private int escritores;
	private String caminho;

	public class Leitor implements Runnable {
		public void run() {
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			int posicao = (int) (Math.random() * 10000) % tamanhoBD;
			try {
				bd.le(this, posicao);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public class Escritor implements Runnable {
		public void run() {
			try {
				Thread.sleep(30);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			int posicao = (int) (Math.random() * 10000) % tamanhoBD;
			try {
				bd.escreve(this, posicao);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public GerenciadorThreads(int leitores, int escritores, String caminho) {
		this.leitores = leitores;
		this.escritores = escritores;
		this.criaThreads();
		this.caminho = caminho;
	}
	
	double executa() {
		bd = new BD(caminho);
		this.tamanhoBD = bd.tamanhoBD();
		this.iniciaThreads();

		return 0;
	}
	
	private void criaThreads() {
		for(int i = 0; i < this.leitores; i++) {
			this.listaThreads.add(new Thread(new Leitor()));
		}
		
		for(int i = 0; i < this.escritores; i++) {
			this.listaThreads.add(new Thread(new Escritor()));
		}
		
		Collections.shuffle(listaThreads);
	}
	
	private void iniciaThreads() {
		Iterator<Thread> it = this.listaThreads.iterator();
		while(it.hasNext()){
			it.next().start();
		}
	}

}
